前幾篇文章已經花費了大量篇幅介紹 Web 應用程式。為了確保 Web Application 能夠 24 小時不間斷地為眾多使用者提供服務,開發者必須時刻記錄系統狀態與發生的事件。這樣可以確認系統是否正常運行,是否有錯誤發生,並能評估錯誤的嚴重性及發生頻率等關鍵資訊。
一般來說,開發者在初學 Python 時,通常會使用 print()
來檢查程式的運行結果,並確認變數的當前值。然而,本篇文章將推薦一個更適合的紀錄工具——Logging。相比於 print()
,Logging 套件具備多項優勢,使其成為 Web Application 的理想選擇。
Log Levels
由於 Web Application 需要為眾多使用者提供 24 小時不間斷的服務,因此所記錄的事件數量極為龐大,開發者不可能逐一解決每個問題事件。為此,Logging 提供了事件等級分類,包括 Debug
、Info
、Warning
、Error
和 Critical
(詳見下圖的官方說明),幫助開發者根據事件的嚴重性決定處理的優先順序。例如,在開發購物功能時,應將購買失敗的錯誤事件歸類為 Error 級別,這樣可確保這類關鍵問題能被優先處理。
此外,值得一提的是 Debug
等級,這基本上相當於初學者所使用的 print()
。開發者可以利用此等級來記錄變數的當前值,從而更有效地進行除錯。
Logger
Logging 套件提供了一個負責記錄事件的類別—Logger。開發者可以直接透過 Logger 來撰寫紀錄,例如使用 logger.error()
來記錄 Error
等級的事件。Logger 本身也設有等級,若事件的等級低於 Logger 的設定,則該事件將無法被成功紀錄,這是一個非常實用的設計。
例如,在開發與測試過程中,開發者可以將 Logger 的等級設為 Debug
,以便檢查變數的當前值。然而,在正式部署並對外開放給使用者時,過多的 Debug
等級的事件可能會成為雜訊,因此可以將 Logger 的等級調整為 Info
,以過濾掉 Debug
等級的紀錄。
Handlerprint()
只能將資訊送至 sys.stdout
(可透過終端器直接觀看),而 Logging 套件提供了客製化的類別--Handler,Handler 是一個專門負責將事件發送至目的地的類別,能夠將 Logger 所記錄的事件傳遞出去。Logging 套件目前提供多種 Handler,方便開發者根據需求選擇合適的 Handler 來寄送事件,並根據目的地的需求調整事件的訊息格式。
例如,開發者可以選擇 StreamHandler
,其預設目的地為常見的 sys.stdout
,並且訊息格式可以是簡單的一長串字串。另一方面,如果開發者選擇 HTTPHandler,則可以將事件發送至某個 HTTP 伺服器,並將訊息格式設定為常見的 JSON 格式。
開發者無需特別安裝 logging 模組,因為它已經包含在 Python 標準庫中。
承接前篇 Flask 的範例,本範例將新增 Logging 功能。首先,開發者需要創建一個 logger 並為其指定名稱,例如 simple_example
,然後將其等級設定為 Debug
。接著,開發者宣告一個 StreamHandler
,以便在終端機上直接觀察日誌紀錄。為了方便觀察,開發者選擇使用一行字串格式來呈現事件,並包含等級和時間等資訊,以便於未來的查詢和分析。最後,開發者在 index route 中使用 logger.info 來記錄事件。
from flask import Flask
import logging
# create logger
logger = logging.getLogger('simple_example')
logger.setLevel(logging.DEBUG)
# create console handler and set level to debug
handler = logging.StreamHandler()
handler.setLevel(logging.DEBUG)
# create formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# add formatter to handler
handler.setFormatter(formatter)
# add handler to logger
logger.addHandler(handler)
app = Flask(__name__)
@app.route('/')
def index():
logger.info('Get index page from new request')
return 'Index Page'
開發者可以透過執行 poetry run flask --app index run
來啟動 Flask Web Application,然後在瀏覽器中輸入 http://127.0.0.1:5000
,即可查看紀錄的事件(如下圖所示)。